﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Abstract;

namespace DAL.Classes
{
    public class FavoritoDAL : abstractDAL
    {
        public void InserirFavorito(PostNew postNew, Usuario usuario)
        {
            try
            {
                UsuarioFavorito favorito = getUsuarioFavoritosPorPostNewEUsuario(postNew, usuario);
                if (favorito != null)
                {
                    throw new InvalidOperationException("Você já favoritou essa PostNew!");
                }
                else
                {
                    UsuarioFavorito favoritos = new UsuarioFavorito()
                    {
                        idUsuario = usuario.idUsuario,
                        idPostNew = postNew.idPostNew
                    };
                    Wiki.UsuarioFavoritos.InsertOnSubmit(favoritos);
                    Wiki.SubmitChanges();
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public void DeleteFavorito(PostNew postNew, Usuario usuario)
        {
            try
            {
                List<UsuarioFavorito> lstFavoritos = new List<UsuarioFavorito>();
                lstFavoritos = (from f in Wiki.UsuarioFavoritos
                                where f.idPostNew == postNew.idPostNew
                                    && f.idUsuario == usuario.idUsuario
                                select f).ToList();

                foreach (UsuarioFavorito usuarioFavorito in lstFavoritos)
                {
                    Wiki.UsuarioFavoritos.DeleteOnSubmit(usuarioFavorito);
                }
                Wiki.SubmitChanges();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public UsuarioFavorito getUsuarioFavoritosPorPostNewEUsuario(PostNew postNew, Usuario usuario)
        {
            try
            {
                return (from f in Wiki.UsuarioFavoritos 
                        where f.idUsuario == usuario.idUsuario 
                        && f.idPostNew == postNew.idPostNew 
                        select f).SingleOrDefault();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public List<PostNew> GetAllFavoritosByUser(Usuario user)
        {
            try
            {
                return (from f in Wiki.PostNews
                        join g in Wiki.UsuarioFavoritos on f.idPostNew equals g.idPostNew
                        where g.idUsuario == user.idUsuario
                        select f).ToList();
            }
            catch (Exception)
            {
                
                throw;
            }
        }
    }
}
